home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Bavarian / Bavarian #197 (19xx)(APS Electronic).zip / Bavarian #197 (19xx)(APS Electronic).adf / ALisp.doc < prev    next >
Lisp/Scheme  |  1988-06-01  |  21KB  |  446 lines

  1.                                                        Weeze, 31.3.1990
  2.  
  3.                                  AmigaLisp
  4.                                  ---------
  5.  
  6.  
  7. AmigaLisp ist ein einfacher, in C (Aztec C Vers. 3.4) geschriebener Lisp -
  8. Interpreter. Der Befehlssatz von AmigaLisp orientiert sich an XLISP bzw. an
  9. Common - Lisp.
  10. Der Quelltext ist dokumentiert und relativ leicht zu verstehen, so daß C -
  11. Programmierer Lisp durch Studium des Interpreters leicht erlernen können.
  12. Ich selbst habe AmigaLisp programmiert, um mir den Einstieg in Lisp zu
  13. vereinfachen.
  14.  
  15. Der Interpreter kann vom CLI aus mit dem Kommando 'AmigaLisp <PrgName>'
  16. geladen und gestartet werden. Dabei bezeichnet der optionale Parameter
  17. PrgName den Quelltext eines Lispprogramms, das vom Interpreter direkt
  18. nachgeladen und gestartet werden soll.
  19.  
  20. Die Benutzerschnittstelle des Interpreters besteht aus zwei Fenstern.
  21. Im Dialogfenster wird die Sitzung protokolliert. Hier erscheinen alle
  22. Ein- und Ausgaben. Bitte geben Sie nicht direkt ins Dialogfenster ein,
  23. sondern benutzen den Editor :
  24. Um die Eingaben freundlicher zu gestalten, ist das zweite Fenster ein
  25. kleiner Editor. Hier geben Sie Ihre Befehle ein, die anschließend ins
  26. Dialogfenster übertragen werden. Mit den Cursortasten können Sie in diesem
  27. Fenster frei herumfahren. Außerdem verfügt diese Eingaberoutine über eine
  28. History. In ihr können Sie mit <shift><cursor up> bzw. <shift><cursor down>
  29. beliebig blättern.
  30. Da das Zeichen "'" häufig benutzt wird, wurde es auf die Taste rechts vom
  31. "ß" gelegt.
  32.  
  33. Nun können Sie den Dialog mit dem Interpreter aufnehmen.
  34.  
  35. Tippen Sie z.B. ein : (+ 3 5 2)
  36. Sie erhalten vom System die Antwort 10. (+ 3 5 2) entspricht also der
  37. mathematischen Schreibweise 3 + 5 + 2. Lisp benutzt die Polnische
  38. Notation (Präfix Notation), bei der die durchzuführende Funktion vor ihre
  39. Argumente gestellt sein muß.
  40.  
  41. Lisp bedeutet Listprocessor, also Listenverarbeiter. Eine Liste beginnt mit
  42. einer Klammer '(' und endet mit einer geschlossenen ')'. Eine Liste kann
  43. beliebig viele Elemente besitzen, die auch selbst wieder Listen sein können.
  44. Soll nun eine Liste ausgewertet (evaluiert) werden, dann interpretiert Lisp
  45. das erste Listenelement als Befehl und weist ihm die restlichen
  46. Listenelemente als Parameter zu. Bei dem Beispiel ist also '+' als erstes
  47. Listenelement der Befehl, dem die Werte 3, 5 und 2 als Parameter zugewiesen
  48. werden.
  49. Ein Lisp Programm ist letztlich eine Aneinanderreihung solcher Listen.
  50. Um sinnvoll programmieren zu können, benötigt man Variablen und Konstanten.
  51. Lisp - Variablen können beliebig lange Zeichenketten sein. Sie werden
  52. Symbole genannt. Konstanten sind (Bruch-) Zahlen, Strings und
  53. Wahrheitswerte ('t' für true und nil oder '()' für false ).
  54. Strings sind Zeichenketten, die durch Anführungszeichen gekennzeichnet sind:
  55. "Dies ist ein String"
  56. Tippt man eine solche Konstante ein, dann erhält man die Eingabe vom
  57. Interpreter als Ausgabe zurück : Konstanten evaluieren zu sich selbst.
  58. Werden dagegen Symbole ausgewertet, dann evaluieren sie zu ihrem Inhalt.
  59. Alle Parameter eines Befehls werden vor der Übergabe stets ausgewertet, wenn
  60. dies nicht verboten wird. (siehe quote oder ').
  61. An Symbole können sowohl Konstante wie auch Listen gekettet sein. Eine Zu-
  62. weisung an ein Symbol geschieht mit der setq - Funktion.
  63. Schreibt man in Basic variable=10, so entspricht dies dem Lisp-Term
  64. (setq variable 10)
  65. Alle Elemente einer Liste sollen doch ausgewertet werden, werden Sie jetzt
  66. vielleicht denken. An 'variable' hängt aber noch überhaupt kein Wert.
  67. Deshalb wird bei dem Befehl setq der erste Parameter nicht ausgewertet.
  68. Gleichbedeutend ist diese Schreibweise :
  69. (set (quote variable) 10)
  70. Der set-Befehl (Man spricht von der Primitive set) entspricht der Primitive
  71. setq , jedoch wird hier auch der erste Parameter ausgewertet. Quote gibt
  72. seinen Parameter unausgewertet zurück. Wird also (quote variable) evaluiert,
  73. so ergibt sich dafür der Wert 'variable'. Da quote sehr häufig benutzt wird,
  74. kann der Befehl so abgekürzt werden :
  75. (set 'variable 10)
  76.  
  77. In Lisp wird eine Liste durch einen Baum intern dargestellt :
  78.  
  79. (a b c d) entspricht :        /\
  80.                              a  /\      / und \ bezeichnen Zeiger
  81.                                 b /\
  82.                                   c ()
  83.  
  84. Für ((a b) (c d)) ergibt sich entsprechend :
  85.  
  86.                                 /\            Die Zeigerpaare sind im
  87.                             /\      /\        Interpreter durch die Struk-
  88.                            a /\    /\ ()      tur paar dargestellt. Die
  89.                              b () c /\        Blätter des Baumes durch
  90.                                     d ()      atom.
  91.  
  92. Der rechtsseitige Baum ist zur Standardliste erklärt worden. Einem rechten
  93. Zeiger kann also nur ein weiteres Zeigerpaar oder () folgen. Sollte dort
  94. aber ein Atom (also ein Endknoten oder Blatt) stehen, dann wird dies bei der
  95. Ausgabe durch einen Punkt mitgeteilt. Solche Bäume können nicht ausgewertet
  96. werden, sind als Datenstruktur aber zulässig. Bei der Eingabe kann durch
  97. Setzen solcher Punkte ein entsprechender Aufbau erzwungen werden.
  98.  
  99. (a.(b.c)) wir so dargestellt :   /\
  100.                                 a  /\
  101.                                    b c
  102.  
  103. Um Programme schreiben zu können, benötigt man bedingte Verzweigungen und
  104. Wiederholungsanweisungen.
  105.  
  106. Bedingte Verzweigungen werden mit dem cond-Befehl ermöglicht :
  107.  
  108. (cond (Bedingung1 Ausdruck1 [Ausdruck2 ...])
  109.       (Bedingung2 Ausdruck1 [Ausdruck2 ...])
  110.       usw.
  111. )
  112.  
  113. In einer cond - Anweisung können beliebig viele Bedingungen auftreten. Die
  114. Bedingungen müssen zu einem Wahrheitswert auswerten. Die Ausdrücke, die der
  115. ersten erfüllten Bedingung folgen, werden ausgewertet. Es dürfen beliebig
  116. viele Ausdrücke folgen.
  117.  
  118. Schleifen :
  119.  
  120. Es gibt drei Schleifenarten. In der while - Schleife wird das
  121. Abbruchkriterium zum Schleifenbeginn abgefragt. In der do-Schleife geschieht
  122. dies am Ende. Die count-Schleife wird verwendet, wenn die Anzahl der
  123. Schleifendurchläufe anfangs bereits feststeht.
  124. Die Schleifen haben die Syntax
  125.  
  126. (while <Bedingung> <Ausdrücke>) bzw. (do <Bedingung> Ausdrücke)
  127. und
  128. (count <n> <Ausdrücke>) wobei n die Anzahl der Durchläufe angibt.
  129.  
  130. Bedingung kann ein beliebiger Lisp-Term sein, der zu einem Wahrheitswert
  131. evaluiert.
  132.  
  133.  
  134. Das Funktionskonzept :
  135.  
  136. ('(lambda (Parameter) Ausdrücke) Werte)
  137.  
  138. Erhält der Interpreter nach Auswertung des ersten Listenelements keinen
  139. Verweis auf einen Befehl, sondern eine Liste, deren erstes Element das
  140. Symbol lambda ist, dann kettet dieser die angegebenen Werte an die lokalen
  141. (optionalen) Parameter und wertet anschließend die Ausdrücke aus.
  142.  
  143. Mit dem Befehl defun wird ein solcher Lambda-Term an ein Symbol gekettet,
  144. das nun als Funktion benutzt werden kann :
  145.  
  146. (setq addiere '(lambda (a b) (+ a b))) entspricht somit
  147. (defun addiere (a b) (+ a b))
  148.  
  149. (addiere 4 6) liefert das Ergebnis 10.
  150.  
  151. In der Parameterliste können noch die Symbole &aux und &rest auftreten.
  152. &aux : Die lokalen Symbole , die einem &aux folgen, werden nicht mit Werte
  153.        der Werteliste initialisiert.
  154. &rest: Das nach &rest folgende Symbol erhält als Wert die Liste allert noch
  155.        nicht zugeordneter Werte.
  156.  
  157. Funktionen können selbstverständlich rekursiv sein.
  158.  
  159. Neben den Lambda - Termen gibt es noch Macro-Terme. Das Symbol lambda ist
  160. hier durch macro ersetzt. Eine Funktion, mit der Macro-Terme an Variablen
  161. gekettet werden, entspricht defun und heißt defmacro.
  162. Macro-Terme werten die Werte nicht aus, bevor sie an die lokalen Symbole
  163. gekettet werden. (Lambda - Terme tun dies !). Außerdem wird das Ergebnis
  164. eines solchen Terms nochmal ausgewertet. Mit dieser Technik lassen sich
  165. reine Textersätze realisieren.
  166.  
  167. Mit defun definierte Funktionen (oder Macros) können rekursiv sein.
  168.  
  169. Neben Funktionen bietet der Befehl progn die Möglichkeit, zusammengehörige
  170. Anweisungslisten auch formal zu einer Liste zusammenzufassen.
  171. (progn <Anweisung><Anweisung>... ) ist formal gleichbedeutend mit
  172. <Anweisung><Anweisung>...
  173. Nur nach der letzten Anweisung kann hier eine Garbage-Collection
  174. durchgeführt werden. Damit kann man bei ausreichender Speichergröße
  175. die Geschwindigkeit von Programmen steigern.
  176.  
  177. Es ist verständlich, wenn nach diesem Grobüberblick noch Fragen offen sind.
  178. Ich verweise hier auf die Beispielprogramme und den Quelltext des
  179. Interpreters.
  180.  
  181. Die Befehle von AmigaLisp :
  182.  
  183. Arithmetik :
  184.  
  185. Allgemeine Operatoren    : +,-,* und /
  186. Operatoren für Ganzzahlen: div  := Ganzzahldivision
  187.                            mod  := Rest der Ganzzahldivision [%]
  188. Operatoren für reelle Zahlen : cast := Zahl in Ganzzahl umwandeln
  189.  
  190. Fließkommafunktionen : (sin X),(cos X),(atan X),(sqrt X),
  191.                        (exp X),(log X)
  192. In der Datei setup.lsp sind weitere elementare Funktionen definiert.
  193.  
  194. Typumwandlungen : (float X)  : transformiert X in Fließkommadarstellung
  195.                   (nofloat X): X wird in eine Bruchzahl gewandelt
  196.  
  197. Zum Zahlenkonzept von AmigaLisp :
  198.  
  199. Bruchrechnung ist eine der Besonderheiten von AmigaLisp. Dazu können
  200. Zahlen sowohl in einer Fließkomma- als auch in expliziter Bruchschreib-
  201. weise dargestellt werden. Brüche werden automatisch gekürzt.
  202. Da diese intern durch zwei Integerzahlen beschrieben werden, ist der so
  203. darstellbare Zahlenbereich allerdings sehr eingeschränkt. Bei ev. Über-
  204. läufen werden aus Effiziensgründen keine Fehlermeldungen ausgegeben.
  205. Deshalb sollten in kritischen Anwendungen Fließkommazahlen benutzt
  206. werden.
  207. Treten in einer Berechnung sowohl Fließkomma- als auch Bruchzahlen auf,
  208. so wird eine Typumwandlung vorgenommen und das Ergebnis liegt als Fließ-
  209. kommazahl vor.
  210. Die Syntax der Zahlendarstellung sei durch folgende EBNF beschrieben :
  211.  
  212. AmigaLisp-Zahl ::= Bruchzahl | Fließkommazahl.
  213. BruchZahl ::= GanzeZahl [ "/" NatürlicheZahl ].
  214. GanzeZahl ::= [-] NatürlicheZahl.
  215. Fließkommazahl ::= GanzeZahl "." NatürlicheZahl [ "e" | "E" ] GanzeZahl.
  216. Ziffer ::= 0|1|2|3|4|5|6|7|8|9.
  217. NatürlicheZahl ::= Ziffer { Ziffer }.
  218.  
  219. Listenbefehle :
  220.  
  221. (car <Liste>)     liefert das erste Listenelement
  222. (cdr <Liste>)     liefert die Restliste
  223. (cadr <Liste>)    liefert das zweite Listenelement
  224. (nth <n> <Liste>) liefert das n-te Listenelement
  225. (cons <Ausdruck1> <Ausdruck2>) richtet ein Zeigerpaar ein, dessen linker
  226.                   Zeiger auf den ausgewerteten Ausdruck1 und dessen rechter
  227.                   Zeiger auf den ausgewerteten Ausdruck2 zeigt.
  228. (list <Ausdruckliste>) evaluiert alle Ausdrücke und fügt sie zu einer Liste
  229.                   zusammen
  230. (null <Ausdruck>) wertet aus zu t, wenn Ausdruck zu () auswertet.
  231. (listp<Ausdruck>) wertet aus zu t, wenn Ausdruck zu einer Liste evaluiert.
  232. (atom <Ausdruck>) wertet aus zu t, wenn Ausdruck zu einem Atom auswertet.
  233.  
  234. Vergleichsfunktionen :
  235.  
  236. Für Zahlen und Strings : >,>=,<,<= und eql (entspricht ==)
  237. Für Atome (Konstanten,Symbolnamen) : eq (Test auf Gleichheit)
  238. Allgemein : equal (Test auf Gleichheit)
  239. Achtung : bei eq und equal müssen die Daten formal gleich sein,
  240.           d.h. 1.0 ist ungleich 1
  241.  
  242. Logische Funktionen :
  243.  
  244. (and <Ausdruckliste>) wertet gg. alle Ausdrücke aus und gibt t zurück, wenn
  245.                       alle zu t evaluieren.
  246. (or <Ausdruckliste>)  wertet Ausdrücke solange aus, bis einer zu t evaluiert
  247. (not <Ausdruck>)      Negiert den evaluierten Ausdruck.
  248.  
  249. Stringfunktionen :
  250.  
  251. (strcat <Ausdruck1> <Ausdruck2>) evaluiert die Ausdrücke und fügt die so
  252.                       entstandenen Strings zu einem zusammen.
  253. (strlen <Ausdruck>)   evaluiert den Ausdruck und ermittelt  die Länge des so
  254.                       entstandenen Strings
  255. (substr <Ausdruck> <Anfang> <Länge (optional>) entspricht MID$ in Basic
  256. (ascii  <Ausdruck>)   Wandelt den Anfangsbuchstaben eines Strings (des
  257.                       evaluierten Ausdrucks) in eine Zahl um.
  258. (chr <Zahl>)          Wandelt die Zahl in einen einelementigen String um.
  259.  
  260.  
  261. Dateifunktionen :
  262.  
  263. (open <String>):  Öffnet die durch den String bezeichnete Datei zum
  264.                   Schreiben.
  265. (open <String>):  Öffnet die durch den String bezeichnete Datei zum
  266.                   Lesen (noch nicht implementiert)
  267. (princdat <Ausdruck>): In die geöffnete Schreibdatei wird das Ergebnis
  268.                   der Ausdruck-Auswertung geschrieben. (siehe princ)
  269. (readdat <String>): Liest alle Einträge einer Datei und gibt sie als
  270.                   Liste verkettet zurücke.
  271. (killfile <String>): Löscht die bezeichnete Datei. Es wird zurückgegeben,
  272.                   ob die Operation erfolgreich war. (t oder nil)
  273.  
  274. Bemerkung : Es kann stets nur eine Schreibdatei geöffnet werden.
  275.  
  276. Beispiel  : (openw "df1:testdatei")(princdat "Hallo")(closew) schreibt
  277.             den String "Hallo" mit den Anführungsstrichen in die Datei
  278.             df1:testdatei.
  279.  
  280.  
  281. spezielle Lisp - Funktionen :
  282.  
  283. (eval <Ausdruck>)  Wertet den Ausdruck zweimal aus.
  284. set und setq    :  siehe oben
  285. kill und killq  :  inverse Befehle zu set und setq.
  286.                    Hiermit werden Variablen wieder aus dem System entfernt.
  287.                    Sie belegen also anschließend keinen Speicherplatz mehr.
  288.                    Es dürfen (und können) nur globale Variablen gelöscht
  289.                    werden.
  290. (princ <Ausdruckliste>) Evaluiert die Ausdrücke und gibt sie im Dialog-
  291.                    fenster aus. Bei reinen Strings werden die Anführungs-
  292.                    zeichen weggelassen.
  293. (terpri)           Die Bildschirmausgabe wird mit einer neuen Zeile fortge-
  294.                    setzt.
  295. (quote <Ausdruck>) gibt einen Ausdruck unausgewertet zurück.
  296.                    Ausnahme : Steht vor einem Atom des Ausdrucks ein Komma,
  297.                    so wird dieses Atom ausgewertet.
  298.  
  299. Systemfunktionen :
  300.  
  301. (free) zeigt die Speicherbelegung an.     (Auch als Menüpunkt vorhanden)
  302. (varlist) zeigt alle gültigen Symbolnamen an.      (ebenfalls Menüpunkt)
  303. (objlist) zeigt alle gültigen Grafikobjektnamen an.(ebenfalls Menüpunkt)
  304. (load <Ausdruck>) wertet Ausdruck aus, der zu einem String evaluieren muß,
  305.                   und läd die damit bezeichnete Datei von Diskette und be-
  306.                   ginnt mit der Auswertung dieser Eingabe. Bisher im Ein-
  307.                   gabepuffer befindliche Daten werden gelöscht.
  308.                   Die load-Funktion ist auch über ein Menü erreichbar.
  309. (read <Ausdruck optional>) Ist kein Ausdruck angegeben, dann liest read
  310.                   einen Lisp-Term von der Tastatur und gibt ihn zurück
  311.                   Ein Ausdruck muß zu einem String auswerten. Dann wird aus
  312.                   dem String ein Lisp-Term gelesen und zurückgegeben.
  313. (forbid)  unterdrückt alle Bildschirmausgaben mit Ausnahme von princ, bis
  314.           diese wieder erlaubt werden.
  315. (allow)   erlaubt alle Bildschirmausgaben wieder
  316. (random <Zahl>)   liefert eine reelle Zufallszahl aus [0,Zahl).
  317.  
  318. Grafikfunktionen :
  319.  
  320. AmigaLisp unterstützt das Prinzip der Turtle-Grafik, bei dem eine hier nicht
  321. explizit dargestellte Schildkröte auf dem Ausgabefenster bewegt wird und
  322. gegebenenfalls Spuren hinterläßt. Daneben ist aber auch ein "herkömmlicher"
  323. Grafiktreiber implementiert.
  324.  
  325. (graphic)  Die Grafik wird eingeschaltet.
  326.            Um einen flimmerfreien Animationsablauf zu erzielen, werden
  327.            zwei Grafikbildschirme installiert, die abwechselnd (bei view)
  328.            in den Vordergrung gebracht werden.
  329.            Reicht der Speicherplatz im ShipMem für zwei Grafikbereiche nicht
  330.            aus, so wird nur einer geöffnet.
  331. (text)     Das Grafikfenster wird ausgeschaltet.
  332.  
  333. Die Befehle graphic und text werden auch für die Vektorgrafik (s.u.) ein-
  334. gesetzt.
  335.  
  336. (draw a b c d e) - zeichnet eine Linie mit der Farbe des Registers c.
  337.    Mit a und b, die zu Wahrheitswerten evaluieren, wird einer von vier
  338.    Zeichen modi ausgewählt :
  339.  
  340.    a       b Von der aktuellen Position Q(x,y) aus wird die Strecke
  341.    ----|----
  342.    t   | t   zum Punkt P(d,e) gezeichnet (absolute Koordinaten)
  343.    nil | t   zum Punkt P(d+x,e+y) gezeichnet (relative Koordinaten)
  344.    t   | nil zu einem Punkt in der Enfernung e gezeichnet. Die Strecke
  345.        |     schließt mit der positiven x-Achse den Winkel d ein.
  346.    nil | nil zu einem Punkt in der Entfernung e gezeichnet. Die Strecke
  347.        |     schließt mit der pos. x-Achse den Winkel d+alpha ein, wobei
  348.              alpha der letzte benutzte Winkel ist. (Winkelangeben relativ)
  349.    Mit diesem Modus können Turtle-Grafikprogramme geschrieben werden. Der
  350.    jeweils erreichte Punkt wird zum Startpunkt für die nächste Operation.
  351.    Ebenso werden die neuen Winkel festgehalten.
  352.    Soll zu einer neuen Position gelangt werden, ohne daß eine Linie gezeich-
  353.    net wird, so ist als Farbe -1 anzugeben. In der setup.lsp - Datei sind
  354.    einige Symbole vordefiniert, die die Arbeit mit diesem Universalbefehl
  355.    erleichtern : KEINE, DUNKEL, WEIß, ROT, GRÜN beziehen sich auf die Farb-
  356.    wahl, ABSOLUT, RELATIV, KOORDINATEN und WINKEL auf die Werte von a und b.
  357.    Die Startposition ist der Koordinatenursprung, der Startwinkel 0 Grad.
  358.    Winkelgrößen werden im Gradmaß angegeben. Um die aktuelle Zeichenposi-
  359.    tion/Zeichenwinkel auslesen zu können, gibt der Befehl im Modus KOORDI-
  360.    NATEN die Ausgangskoordinaten der Strecke und im Modus WINKEL den Aus-
  361.    gangswinkel zurück. Punkte sind Strecken der Länge 0.
  362.  
  363.    Bsp.: (draw ABSOLUT KOORDINATEN WEIß 10 10) - zieht eine Linie zum
  364.          Punkt P(10 10).
  365.          (draw RELATIV KOORDINATEN KEINE 0 0) - liefert die aktuellen
  366.          Koordinaten der Zeichenposition
  367.          (draw RELATIV WINKEL KEINE 0 0) - liefert die aktuelle Richtung
  368.  
  369. (ellipse Farbe x y hradius vradius) - zeichnet eine Ellipse mit Mittel-
  370.    punkt P(x,y) in der gewählten Farbe mit den bezeichneten Radien.
  371.  
  372. (fill Farbe x y) - füllt den Bereich, in dem P(x y) liegt mit der gewählten
  373.    Farbe.
  374.  
  375. (clear)   Der Grafikbildschirm wird gelöscht.
  376.  
  377. Vektorgrafikbefehle:
  378.  
  379. ALisp ermäglicht die Darstellung von 3D-Gittermodellen.
  380.  
  381. (defobj name <Liste>) Definiert ein Grafikobjekt bestehend aus Polygon-
  382.                       zügen, Strecken und Punkten.
  383.                       Die Liste ist eine Liste der Polygonzüge. Ein Poly-
  384.                       gonzug ist eine Liste der Eckpunkte.
  385.                       Ein Eckpunkt ist eine Liste der drei Koordinaten.
  386.                       Bsp.: (defobj quadrat '(((0 0 0)(0 1 0)(1 1 0)(1 0 0))))
  387. (killo name)          Entfernt das Grafikobjekt name wieder aus dem System.
  388. (rotate_x name <Winkel>) Das bezeichnete Grafikobjekt wird um den
  389. (rotate_y name <Winkel>) entsprechenden Winkel um die angegebene Achse
  390. (rotate_z name <Winkel>) gedreht.
  391. (strech name <Koordinatentripel>) Multiplikation aller Koordinaten des
  392.                       Objekts mit den entsprechenden des Tripels
  393. (put name <Tripel>)   verschiebt das Objekt zum angegebenen Punkt.
  394. (color name <Zahl>)   Farbregisterdefinition für das Objekt
  395. (setpos name <Tripel>)Definition der Weltkoordinaten des Objekts
  396. (print name)          Zeigt das Objekt auf dem Bildschirm
  397. (view)                Zeigt alle Objekte an (gesamte 3D-Welt)
  398.                       Dabei wird das Ausgabe-Fenster gewechselt, so daß
  399.                       ein flimmerfreier Eindruck entstehen sollte.
  400.  
  401. Der Interpreter kann durch Anklicken des entsprechenden Menüpunktes
  402. verlassen werden. Die Menüpunkte sind selbsterklärend.
  403.  
  404. Arbeitsspeicher wird vom Interpreter automatisch angefordert und an die
  405. Bedürfnisse angepaßt. Lisp benötigt viel Speicher. 1 MB RAM ist also
  406. empfehlenswert, jedoch nicht notwendig.
  407.  
  408. AmigaLisp fängt alle Programmierfehler sicher ab. Nur wird nicht getestet,
  409. ob der Stack für das Interpreterprogramm selbst stets ausreicht.
  410. Finden sehr tiefe Rekursionen in den Lisp-Programmen statt, so muß auch
  411. der Stack für den Interpreter angemessen dimensioniert sein.
  412. Läuft der Stack über, so gelangt der Rechner in einen undefinierten Zustand.
  413.  
  414. Achtung : Bitte stets für einen genügend großen Stack sorgen !
  415.  
  416. Auf dieser Diskette befinden sich die folgenden Beispielprogramme:
  417.  
  418. hanoi.lsp     : Türme von Hanoi als Lisp-Programm (type oder ed)
  419.                 Ausführung mittels 'AmigaLisp hanoi.lsp'
  420. fakul.lsp     : Fakultätsberechnung in Lisp
  421. bubble.lsp    : Ein Bubblesortalgorithmus in Lisp
  422. insertsort.lsp: Sortieren durch Einfügen
  423. eliza.lsp     : Eine Demo der KI (oder auch nicht...)
  424. demo.lsp      : Demonstration der Vektorgrafikbefehle
  425. disk.lsp      : - " -
  426. pharao.lsp    : Grafikdemo
  427. pythagoras.lsp: - " -
  428. palindrom.lsp : Plalindromerkennung mit zwei Listen.
  429.                 (Ein Palindrom ist eine symmetrische Zeichenkette)
  430.  
  431. Der Quelltext des Interpreters liegt mit den Dateien modul1, modul2,
  432. modul3.c, modul4.c, modul5.c, modul6.c, modul7.c und modul8.c vor.
  433.  
  434. modul1 : Funktionen zur Speicherverwaltung, Ein- und Ausgabe von Listen
  435. modul2 : Variablenverwaltung, Prozedur zum Auswerten von Lisp-Ausdrücken
  436. modul3 : Elementare Lisp-Operationen
  437. modul4 : Kontrollstrukturen
  438. modul5 : Stringbefehle
  439. modul6 : Grafikbefehle
  440. modul7 : Vektorgrafikroutinen
  441. modul8 : Benutzeroberfläche
  442.  
  443. Viel Spaß mit AmigaLisp.
  444.  
  445.                                       Steffen Goebbels
  446.